<?

/**
 * Invitados class
 *
 * Esta clase maneja los invitados a los eventos
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@gmail.com>
 * @version 1.0
 * @package Eventos
*/
class Invitados extends Core {

	static protected $instancia;
	static protected $opciones = array(
		'rpp' => 100, // Resultados por pagina 
		'filtros' => array(), // Filtros para la funcion listar
		'page' => 1, // Numero de pagina por defecto
		'order' => array('t1.nombre', 'ASC') // Ordenamiento de listar() con el tipo de ordenamiento (opcional)
	);
	protected $count = 0;
	protected $paginas = 0;
	public $tabla = 'evn_novios'; // Tabla que contiene los invitados
	private $id_tipo_evento = null;
	private $pk = 'id'; // Primary Key de la tabla de invitados

	/**
	 * Constructor de la clase.
	 * 
	 * @param integer $id_tipo (opcional) El id del tipo de evento de los usuarios
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 */
	function __construct ($id_tipo_evento=null, $opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
		// Seteo el id de evento
		$this->tipo_evento($id_tipo_evento);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Setea el tipo de evento para la instancia
	 * 
	 * @param integer $id_tipo (opcional) El id del tipo de evento. Si no esta definido, el metodo funciona como un getter
	 * @return integer El id de este tipo de evento
	 */
	public function tipo_evento ($id_tipo_evento=null) {
		if ($id_tipo_evento) {
			$this->id_tipo_evento = addslashes($id_tipo_evento);

			// Obtengo el objeto de base de datos
			$db = ($this)? $this->db : ez_sql::getInstance();

			// Almaceno tambien la tabla de este tipo de evento
			$this->tabla = $db->get_var("SELECT tabla FROM evn_tipos WHERE id = '$id_tipo_evento'");
		}
		
		return $this->id_tipo_evento;
	}

	/**
	 * Devuelve la informacion de un invitado
	 * 
	 * @param integer $id_invitado El id del invitado
	 * @return array El contenido html del template generado y su asunto
	 */
	public function get ($id_invitado) {

		// Saneamiento de variables
		$id_invitado = addslashes($id_invitado);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el registro del template
		$invitado = $db->get_row("SELECT * FROM ".$this->tabla." t1 WHERE ".$this->pk." = '$id_invitado'");

		return $invitado;
	}

	/**
	 * Guarda los cambios a un invitado. 
	 * 
	 * @param array $campos Los campos a almacenar. Si recibe id_invitado, modifica sino agrega
	 * @return integer El id de registro insertado o actualizado
	 */
	public function save ($campos) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si quiere actualizarlo o agregarlo. Si es un nuevo registro, chequeo que no exista ese mail para el evento
		if (!($id = $campos['id_invitado']))
			$id = $db->get_var("SELECT ".$this->pk." FROM ".$this->tabla." WHERE email = '".$campos['email']."' AND id_evento = ".$campos['id_evento']."");

		if ($id)
			$db->update($this->tabla, array_merge($campos, array($this->pk => $id)));
		else
			$id = $db->insert($this->tabla, $campos);

		return $id;
	}

	/**
	 * Cambia de estado a un invitado
	 * 
	 * @param integer $id_invitado El invitado que se quiere cambiar de estado
	 * @param integer $id_estado El estado al que se lo quiere mover
	 * @return boolean
	 */
	public function cambiar_estado ($id_invitado, $id_estado) {

		// Saneamiento de variables
		$id_invitado = addslashes($id_invitado);
		$id_estado = addslashes($id_estado);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si tengo que actualizarlo o insertarlo
		$db->update($this->tabla, array($this->pk => $id_invitado, 'estado' => $id_estado));

		return true;
	}

	/**
	 * Mueve un invitado a otro evento
	 * 
	 * @param integer $id_invitado El invitado que se quiere mover de evento
	 * @param integer $id_evento El evento al que se lo quiere mover
	 * @return boolean
	 */
	public function mover ($id_invitado, $id_evento) {

		// Saneamiento de variables
		$id_invitado = addslashes($id_invitado);
		$id_evento = addslashes($id_evento);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si tengo que actualizarlo o insertarlo
		$db->update($this->tabla, array($this->pk => $id_invitado, 'id_evento' => $id_evento));

		return true;
	}

	/**
	 * Confirma la asistencia de un invitado al evento que esta invitado
	 * 
	 * @param integer $id_invitado El invitado que se quiere confirmar como que asistio
	 * @return boolean
	 */
	public function confirmar ($id_invitado) {

		// Saneamiento de variables
		$id_invitado = addslashes($id_invitado);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si tengo que actualizarlo o insertarlo
		$db->update($this->tabla, array($this->pk => $id_invitado, 'asistente' => '1'));

		return true;
	}

	/**
	 * Devuelve el listado de invitados a este evento
	 * 
	 * @param integer $id_evento El id del evento del que se quieren los invitados
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 * @return array
	 */
	public function listar ($id_evento, $opciones=null) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Seteo las opciones
		$opciones = ($this instanceof self)? $this->opciones($opciones) : self::opciones($opciones);

		// Armo el order by 
		$order = $opciones['order']; $order_by = '';
		if ( !is_array($order) || (count($order) == 1) || ((count($order) == 2) && (preg_match('/desc|asc/i', $order[1]))) )
			$order = array($order);

		if ($order)
			foreach ($order as $o) 
				$order_by .= ", ".(is_array($o)? $o[0].' '.$o[1] : $o);

		// Armo los filtros
		$and = "t1.id_evento = $id_evento ";
		if ($opciones['filtros'])
			$and .= preg_replace('/(AND )([^ ]+)/', '\\1t1.\\2', 'AND '.implode(' AND ', $opciones['filtros']));

		// Si la tabla tiene id_rubro, lo agrego el join
		if ($this->tabla == 'evn_proveedores') {
			$select = ", pr.rubro";
			$join = " LEFT JOIN prov_rubros pr ON t1.id_rubro = pr.id ";
		}
		
		// Si la tabla tiene id_localidad, lo agrego el join
		if ($this->tabla == 'evn_novios') {
			$select = ", sl.localidad, sl.id_provincia";
			$join = " LEFT JOIN sys_localidades sl ON t1.id_localidad = sl.id ";
		}

		// Obtengo los invitados
		$query = "SELECT SQL_CALC_FOUND_ROWS t1.*, ee.estado estado_nombre, IFNULL(pp.proveedor, '-') proveedor $select
				FROM ".$this->tabla." t1
				LEFT JOIN evn_estados ee ON t1.estado = ee.id
				LEFT JOIN prov_proveedores pp ON t1.id_proveedor = pp.id
				$join
				WHERE $and
				" . ($order? 'ORDER BY '.substr($order_by, 1) : '') . 
				" LIMIT " . (($opciones['page'] - 1) * $opciones['rpp']) . ", " . $opciones['rpp'];
		if ($_invitados = $db->get_results($query))
			foreach ($_invitados as $invitado)
				$invitados[$invitado[$this->pk]] = $invitado;

//$db->debug();
		// Seteo el count
		$this->count = $db->get_var('SELECT FOUND_ROWS()');

		return $invitados;
	}

	/**
	 * Descarga el listado que se pide en un excel
	 * 
	 * @param integer $id_evento El id del evento del que se quieren los invitados
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 * @return array
	 */
	public function excel ($id_evento, $opciones=null) {
		// Configuraciones de formato
		$field 	= "\t"; // Separador de campos
		$line	= "\n"; // Separador de lineas
		$escape = ""; // Escape de caracteres
		$enclose = ''; // Enclose de los campos

		// Obtengo el listado
		$listado = $this->listar($id_evento, array_merge($opciones, array('rpp' => 100000000)));

		// Defino el string de salida
		$out = '';

		// Obtengo los encabezados
		$headers = array_keys(current($listado));
		
		// Agrego los encabezados 
		$out = implode($field, $headers).$line;
		
		// Recorro los resultados 
		foreach ($listado as $items)
			$out .= implode($field, array_values($items)).$line;

		// Envio los encabezados de descarga
		header('Content-Type: ' . $mime_type);
		header('Content-Disposition: attachment; filename="listado.csv"');
		header("Content-Transfer-Encoding: binary");
		header('Accept-Ranges: bytes');
		header("Cache-control: private");
		header('Pragma: private');
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

        echo $out;
        flush();
		exit;
	}


	/**
	 * Devuelve el listado de empresas que tienen invitados en un evento determinado
	 * 
	 * @param integer $id_evento El id del evento del que se quieren las empresas
	 * @return array
	 */
	public function empresas ($id_evento) {

		// Saneamiento de variables
		$id_evento = addslashes($id_evento);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo las empresas
		$empresas = $db->get_results("SELECT pp.id, pp.proveedor
									FROM prov_proveedores pp, ".$this->tabla." t1
									WHERE pp.id = t1.id_proveedor AND t1.id_evento = $id_evento");
		
		return $empresas;
	}

	/**
	 * Programa un envio con el emailer de un template para un listado de contactos
	 * 
	 * @param integer $id El id del template que se va a enviar
	 * @param array $destinatarios Los destinatarios del mail
	 * @return boolean
	 */
	public function mail ($id, $destinatarios) {

		// Saneamiento de variables
		$id = addslashes($id);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el template
		$Template = new Templates();
		$template = $Template->get($id);
		$url = $Template->url($id);
		
		// Inserto el template
		$id_newsletter = $db->insert('emailer_newsletter', array(
			'remitente'	=> 'CasamientosOnline.com',
			'email'		=> 'info@casamientosonline.com',
			'asunto'	=> $template['asunto'],
			'mensaje'	=> $url,
			'enviar'	=> date("Y-m-d H:i:s"),
		));
		
		// Recorro los destinatarios y los agrego 
		foreach ($destinatarios as $id_destinatario) {
			
			// Obtengo el contacto
			$destinatario = $this->get($id_destinatario);
			
			$db->insert($this->tabla.'_envios', array(
				'id_newsletter'	=> $id_newsletter,
				'destinatario'	=> $destinatario['nombre'].' '.$destinatario['apellido'],
				'email'			=> $destinatario['email'],
			));
		}

		return true;
	}
	
}

?>
